// Emacs style mode select	 -*- C++ -*-
//-----------------------------------------------------------------------------
//
// $Id:$
//
// Copyright (C) 1993-1996 by id Software, Inc.
//
// This source is available for distribution and/or modification
// only under the terms of the DOOM Source Code License as
// published by id Software. All rights reserved.
//
// The source is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
// for more details.
//
// DESCRIPTION:
//		Refresh/rendering module, shared data struct definitions.
//
//-----------------------------------------------------------------------------


#ifndef __R_DEFS__
#define __R_DEFS__


// Screenwidth.
#include "doomdef.h"

// Some more or less basic data types
// we depend on.
#include "m_fixed.h"

// We rely on the thinker data struct
// to handle sound origins in sectors.
#include "d_think.h"
// SECTORS do store MObjs anyway.
#include "p_mobj.h"



#ifdef __GNUG__
#pragma interface
#endif



// Silhouette, needed for clipping Segs (mainly)
// and sprites representing things.
#define SIL_NONE				0
#define SIL_BOTTOM				1
#define SIL_TOP					2
#define SIL_BOTH				3

#define MAXDRAWSEGS				256





//
// INTERNAL MAP TYPES
//	used by play and refresh
//

//
// Your plain vanilla vertex.
// Note: transformed values not buffered locally,
//	like some DOOM-alikes ("wt", "WebView") did.
//
typedef struct
{
    fixed_t		x;
    fixed_t		y;

} vertex_t;


// Forward of LineDefs, for Sectors.
struct line_s;

// Each sector has a degenmobj_t in its center
//	for sound origin purposes.
// I suppose this does not handle sound from
//	moving objects (doppler), because
//	position is prolly just buffered, not
//	updated.
typedef struct
{
    thinker_t			thinker;		// not used for anything
    fixed_t				x;
    fixed_t				y;
    fixed_t				z;

} degenmobj_t;

//
// The SECTORS record, at runtime.
// Stores things/mobjs.
//
typedef struct
{
    fixed_t		floorheight;
    fixed_t		ceilingheight;
    short		floorpic;
    short		ceilingpic;
    short		lightlevel;
    short		special;
    short		tag;

    // 0 = untraversed, 1,2 = sndlines -1
    int			soundtraversed;

    // thing that made a sound (or null)
    mobj_t*		soundtarget;

    // mapblock bounding box for height changes
    int			blockbox[4];

    // origin for any sounds played by the sector
    degenmobj_t soundorg;

    // if == validcount, already checked
    int			validcount;

    // list of mobjs in sector
    mobj_t*		thinglist;

    // thinker_t for reversable actions
    void*		specialdata;

    int					linecount;
    struct line_s**		lines;	// [linecount] size

} sector_t;




//
// The SideDef.
//

typedef struct
{
    // add this to the calculated texture column
    fixed_t		textureoffset;

    // add this to the calculated texture top
    fixed_t		rowoffset;

    // Texture indices.
    // We do not maintain names here.
    short		toptexture;
    short		bottomtexture;
    short		midtexture;

    // Sector the SideDef is facing.
    sector_t*	sector;

} side_t;



//
// Move clipping aid for LineDefs.
//
typedef enum
{
    ST_HORIZONTAL,
    ST_VERTICAL,
    ST_POSITIVE,
    ST_NEGATIVE

} slopetype_t;



typedef struct line_s
{
    // Vertices, from v1 to v2.
    vertex_t*	v1;
    vertex_t*	v2;

    // Precalculated v2 - v1 for side checking.
    fixed_t		dx;
    fixed_t		dy;

    // Animation related.
    short		flags;
    short		special;
    short		tag;

    // Visual appearance: SideDefs.
    //	sidenum[1] will be -1 if one sided
    short		sidenum[2];

    // Neat. Another bounding box, for the extent
    //	of the LineDef.
    fixed_t		bbox[4];

    // To aid move clipping.
    slopetype_t slopetype;

    // Front and back sector.
    // Note: redundant? Can be retrieved from SideDefs.
    sector_t*	frontsector;
    sector_t*	backsector;

    // if == validcount, already checked
    int			validcount;

    // thinker_t for reversable actions
    void*		specialdata;
} line_t;




//
// A SubSector.
// References a Sector.
// Basically, this is a list of LineSegs,
//	indicating the visible walls that define
//	(all or some) sides of a convex BSP leaf.
//
typedef struct subsector_s
{
    sector_t*	sector;
    short		numlines;
    short		firstline;

} subsector_t;



//
// The LineSeg.
//
typedef struct
{
    vertex_t*	v1;
    vertex_t*	v2;

    fixed_t		offset;

    angle_t		angle;

    side_t*		sidedef;
    line_t*		linedef;

    // Sector references.
    // Could be retrieved from linedef, too.
    // backsector is NULL for one sided lines
    sector_t*	frontsector;
    sector_t*	backsector;

} seg_t;



//
// BSP node.
//
typedef struct
{
    // Partition line.
    fixed_t		x;
    fixed_t		y;
    fixed_t		dx;
    fixed_t		dy;

    // Bounding box for each child.
    fixed_t		bbox[2][4];

    // If NF_SUBSECTOR its a subsector.
    unsigned short children[2];

} node_t;




// posts are runs of non masked source pixels
typedef struct
{
    byte				topdelta;		// -1 is the last post in a column
    byte				length;			// length data bytes follows
} post_t;

// column_t is a list of 0 or more post_t, (byte)-1 terminated
typedef post_t	column_t;



// PC direct to screen pointers
//B UNUSED - keep till detailshift in r_draw.c resolved
//extern byte*	destview;
//extern byte*	destscreen;





//
// OTHER TYPES
//

// This could be wider for >8 bit display.
// Indeed, true color support is posibble
//	precalculating 24bpp lightmap/colormap LUT.
//	from darkening PLAYPAL to all black.
// Could even us emore than 32 levels.
typedef byte	lighttable_t;




//
// ?
//
typedef struct drawseg_s
{
    seg_t*				curline;
    int					x1;
    int					x2;

    fixed_t				scale1;
    fixed_t				scale2;
    fixed_t				scalestep;

    // 0=none, 1=bottom, 2=top, 3=both
    int					silhouette;

    // do not clip sprites above this
    fixed_t				bsilheight;

    // do not clip sprites below this
    fixed_t				tsilheight;

    // Pointers to lists for sprite clipping,
    //	all three adjusted so [x1] is first value.
    short*				sprtopclip;
    short*				sprbottomclip;
    short*				maskedtexturecol;

} drawseg_t;



// Patches.
// A patch holds one or more columns.
// Patches are used for sprites and all masked pictures,
// and we compose textures from the TEXTURE1/2 lists
// of patches.
typedef struct
{
    short				width;			// bounding box size
    short				height;
    short				leftoffset;		// pixels to the left of origin
    short				topoffset;		// pixels below the origin
    int					columnofs[8];	// only [width] used
    // the [0] is &columnofs[width]
} patch_t;







// A vissprite_t is a thing
//	that will be drawn during a refresh.
// I.e. a sprite object that is partly visible.
typedef struct vissprite_s
{
    // Doubly linked list.
    struct vissprite_s* prev;
    struct vissprite_s* next;

    int					x1;
    int					x2;

    // for line side calculation
    fixed_t				gx;
    fixed_t				gy;

    // global bottom / top for silhouette clipping
    fixed_t				gz;
    fixed_t				gzt;

    // horizontal position of x1
    fixed_t				startfrac;

    fixed_t				scale;

    // negative if flipped
    fixed_t				xiscale;

    fixed_t				texturemid;
    int					patch;

    // for color translation and shadow draw,
    //	maxbright frames as well
    lighttable_t*		colormap;

    int					mobjflags;

} vissprite_t;


//
// Sprites are patches with a special naming convention
//	so they can be recognized by R_InitSprites.
// The base name is NNNNFx or NNNNFxFx, with
//	x indicating the rotation, x = 0, 1-7.
// The sprite and frame specified by a thing_t
//	is range checked at run time.
// A sprite is a patch_t that is assumed to represent
//	a three dimensional object and may have multiple
//	rotations pre drawn.
// Horizontal flipping is used to save space,
//	thus NNNNF2F5 defines a mirrored patch.
// Some sprites will only have one picture used
// for all views: NNNNF0
//
typedef struct
{
    // If false use 0 for any position.
    // Note: as eight entries are available,
    //	we might as well insert the same name eight times.
    boolean		rotate;

    // Lump to use for view angles 0-7.
    short		lump[8];

    // Flip bit (1 = flip) to use for view angles 0-7.
    byte		flip[8];

} spriteframe_t;



//
// A sprite definition:
//	a number of animation frames.
//
typedef struct
{
    int					numframes;
    spriteframe_t*		spriteframes;

} spritedef_t;



//
// Now what is a visplane, anyway?
//
typedef struct
{
    fixed_t				height;
    int					picnum;
    int					lightlevel;
    int					minx;
    int					maxx;

    // leave pads for [minx-1]/[maxx+1]

    byte			pad1;
    // Here lies the rub for all
    //  dynamic resize/change of resolution.
    byte			top[SCREENWIDTH];
    byte			pad2;
    byte			pad3;
    // See above.
    byte			bottom[SCREENWIDTH];
    byte			pad4;

} visplane_t;




#endif
//-----------------------------------------------------------------------------
//
// $Log:$
//
//-----------------------------------------------------------------------------
